/*********************************************************************************
 *      Copyright:  (C) 2023 Lin XinCheng
 *                  All rights reserved.
 *
 *       Filename:  sht20app.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2023年07月24日)
 *         Author:  Lin XinCheng <1481155734@qq.com>
 *      ChangeLog:  1, Release initial version on "2023年07月24日 10时12分19秒"
 *                 
 ********************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <errno.h>


int main (int argc, char **argv)
{
	float	temp=0;
	float	humility=0;

	if(sht20_get_temp_humi(&temp, &humility) < 0 )
	{
		printf("ERROR:sht20 get temperature and humility failure\n");
		return 1;
	}

	printf("sht20 get temperature:%f 'C\n",temp);
	printf("sht20 get humility:%f %\n",humility);
	
	return 0;
} 

int sht20_get_temp_humi(float *temp, float *humility)
{
	const char	*sht20_path = "/sys/class/sht20/sht20";
	char		ds_path[50];	//采样路径
	char		buf[128];		//read()读取数据的存储buffer
	DIR			*dirp = NULL;	//opendir()打开文件夹
	int 		fd = -1;		//open()打开文件的文件描述符
	char		*ptr_begin = NULL;	//一个字符开始指针 用来字符处理
	char		*ptr_end = NULL;	//一个字符开始指针，用来字符串处理
	char		data_buf[16];
	int			rv = 0;			//函数返回值，默认设置为成功返回(0)
	
	/*  在C语言编程时，进入函数的第一件事应该进行函数参数的合法性检测，检查参数非法输入。
	 *  * 否则调用者"不小心"通过 $temp 传入一个空指针，下面的代码就有可能出现段错误。
	 *  */
	if( !temp )
	{
		return -1;
	}
	/* 我的驱动 打开 "/sys/class/w1_ds18b20/w1_ds18b20/" 文件夹，如果打开失败则打印错误信息并退出。 */
	if((dirp = opendir(sht20_path)) == NULL)
	{
		printf("opendir error :%s\n",strerror(errno));
		return -2;
	}

	snprintf(ds_path, sizeof(ds_path), "%s/temp_humility",sht20_path);

	/* 接下来打开 DS18B20 的采样文件，如果失败则返回相应的错误码-3 */
	if( (fd = open(ds_path, O_RDONLY)) < 0 )
	{
		printf("open %s error :%s\n", ds_path, strerror(errno));
		return -3;
	}

	/*  读取文件中的内容将会触发 DS18B20温度传感器采样，这里读取文件内容保存到buf中 */
	if( read(fd, buf, sizeof(buf)) < 0 )
	{
		printf("read %s error:%s\n", ds_path, strerror(errno));
		rv = -5;
		goto cleanup;
	}

	/*  采样温度值是在字符串"t="后面，这里我们从buf中找到"t="字符串的位置并保存到ptr指针中  */
	ptr_begin = strstr(buf, "t=");
	ptr_end = strstr(buf, ",");

	if( !ptr_begin || !ptr_end )
	{
		printf("ERROR:Can not get temperature\n");
		rv = -6;
		goto cleanup;
	}
	else{
		/*  因为此时ptr是指向 "t="字符串的地址(即't'的地址)，那跳过2个字节(t=)后面的就是采样温度值  */
		ptr_begin = ptr_begin + strlen("t=");
		memcpy(data_buf, ptr_begin, ptr_end - ptr_begin);
	}

	/*  接下来我们使用 atof() 函数将采样温度值字符串形式，转化成 float 类型。*/
	*temp = -46.85 + 175.72/65536 * atof(data_buf);

	ptr_begin = strstr(buf, "h=");
	ptr_begin += strlen("h=");

	*humility = -6.0 + 125.0/65536 * atof(ptr_begin);

cleanup:
	close(fd);
	return rv;
}


